class tool {

    // };
    // 使用例子 $tool.param(xxxx);
    // tool.prototype = {
    /**
     * @description 判断对象是否为空
     * @param {object} e 判断介值
     * @returns {boolean} false 为对象，true 不是对象-或者格式不佳
     * @author 一枚前端 
     */
    isEmptyObject(e) {
        var t;
        for (t in e)
            return !1;
        return !0
    }
    /**
     * @description 判断是否为数组
     * @param {object} a 判断介值
     * @returns {boolean} true 为数组，false 不是数组-或者格式不佳
     * @author 一枚前端 
     */
    isArray(a) {
        return (typeof a === 'object' && !isNaN(a.length)) //true
    }
    /**
     * @description 返回当前-对象或者数组 值的下标
     * @param {object||array} arr 可以为对象 或者数组-如果对象-则只判断是否包含该值。
     * @param {string} value 查找的值
     * @param {string} key 查找下标
     * @returns {number} index 下标 -1为未找到
     * @author 一枚前端
     */
    indexOfArr(arr, value, key) {
        var index = -1;
        if (!this.isArray(arr)) { //如果为对象则只判断是否包含该值。
            for (var val in arr) {
                if (arr[val] == value) {
                    index = true;
                }
            };
        } else {
            arr.forEach(function (val, i) {
                if (val[key] == value) {
                    index = i;
                };
            });
        };
        return index;
    }
    /**
     * 将一个对象转化为‘&key1=value1&key2=value2....’格式
     * @param m{JSON} 需要转化的JSON对象,
     * @return {String}型为‘&key1=value1&key2=value2....’的字符串
     * @author 一枚前端
     */
    param(m) {
        var d = "";
        if (!this.isArray(m)) {
            var count = 0;
            for (var val in m) {
                if ((m[val] || (m[val] === false && m[val] != '') || m[val] === 0) && !this.isArray(m[val])) {
                    count++;
                    if (count == 1) {
                        d = val + "=" + m[val];
                    } else {
                        d += "&" + val + "=" + m[val];
                    }
                }
            }
        }
        return d;
    }
    /**
     * @description 将数组转换为 , 逗号拼接字符串
     * @param {array} item 转换的数组
     * @param {string} key 非必填。数组中的下标
     * @return {string} 返回字符串 例如：张三,李四,王麻子
     * @author 一枚前端
     */
    toString(item, key) {
        var d = "";
        if (!key) {
            console.warn("没有传入键");
        };
        //如果是数组
        if (this.isArray(item)) {
            var count = 0;
            angular.forEach(item, function (val, i) {
                var vals = key ? val[key] : val;
                if (count == 0) {
                    d = vals;
                } else {
                    d += "," + vals;
                }
                count++;
            });
        };
        return d;
    }
    /**
     * @description 生成随机数
     * @param {number} min 最小数
     * @param {number} max 最大数
     * @returns {number} rang 结果
     * @author 一枚前端
     */
    getRandomNum(Min, Max) {
        var Range = Max - Min;
        var Rand = Math.random();
        return (Min + Math.round(Rand * Range));
    }
    /**
     * @description 取当前时间戳加密的字符串
     * @returns {number} rang 结果
     * @author 一枚前端
     */
    getRandomTime() {
        var Range = md5(new Date().getTime());
        return (Range);
    }
    /**
     * @description 计算两个时间段内相差天数
     * @param {string} startDate 开始时间
     * @param {string} endDate 开始时间
     * @param {string} sign 计算方式
     * @returns {number} msg 结果
     * @author 一枚前端
     */
    countTime(startDate, endDate, sign) {
        sign = sign ? sign : "day";
        try {
            if (startDate && endDate) {
                var redata = "",
                    startTime = new Date(startDate).getTime(),
                    endTime = new Date(endDate).getTime();
                if (sign == "day") {
                    redata = Math.abs(Math.floor((startTime - endTime) / 86400000));
                }
                return redata;
            } else {
                throw new Error("开始和结束时间不能为空");
            }
        } catch (error) {
            console.error(error);
        }
    }
    /**
     * @description 获取当前时间为周几
     * @param {number} week 当前周的编号
     * @author 一枚前端
     */
    setWeek(week) {
        var str = "周";
        switch (week) {
            case 0:
                str += "日";
                break;
            case 1:
                str += "一";
                break;
            case 2:
                str += "二";
                break;
            case 3:
                str += "三";
                break;
            case 4:
                str += "四";
                break;
            case 5:
                str += "五";
                break;
            case 6:
                str += "六";
                break;
        };
        return str;
    }
    /**
     * @description 根据传入天数加减时间
     * @param {string} date 时间 格式 2017-11-21 11:43:00
     * @param {string} day 计算天数
     * @param {string} sign 计算方式 + -
     * @param {string} dateFmt 返回格式 格式 yyyy-MM-dd HH:mm:ss
     * @param {boolean} time 是否以时间戳返回
     * @returns {string} 计算时间字符串
     * @author 一枚前端
     */
    setTime(date, day, sign, dateFmt, time) {
        try {
            if (date && (day || day == 0) && typeof (day * 1) == "number") {
                var redata = "",
                    sign = sign ? sign : "+",
                    date = new Date(date).getTime(),
                    daTime = day * 86400000,
                    dateFmt = dateFmt ? dateFmt : 'yyyy-MM-dd HH:mm:ss';
                if (sign == "+") {
                    if (time) {
                        redata = date + daTime;
                    } else {
                        redata = $tool.date(date + daTime, dateFmt);
                    }
                } else {
                    if (time) {
                        redata = date - daTime;
                    } else {
                        redata = $tool.date(date - daTime, dateFmt);
                    }
                }
                return redata;
            } else {
                throw new Error("时间与计算天数不能为空,或者天数类型错误");
            }
        } catch (error) {
            console.error(error);
        }
    }
    /**
     * @description 去掉字符串前后所有空格
     * @param {string} str 匹配的字符串
     * @returns {string} 处理结果
     * @author 一枚前端
     */
    trim(str) {
        return str.replace(/(^\s*)|(\s*$)/g, "");
    }
    /**
     * @description 日期格式化
     * 示例 $tool.date('1513142594000','yyyy-MM-dd') || $tool.date('2017/12/13 13:23:14','yyyy-MM-dd')
     * @param {time} value 日期。
     * @param {string} type 默认yyyy-MM-dd 支持格式yyyy-MM-dd oday HH:mm:ss （oday 昨天 前天 ...）
     * @returns {string} 格式化后的日期字符串
     * @author 一枚前端
     */
    date(value, type) {
        var that = this;
        if (!value) return;
        //元素的补零计算
        function addZeroF(val) {
            if (val < 10) {
                return "0" + val.toString();
            } else {
                return val;
            }
        };
        //获取时间显示几天前
        function getDateInfo(date) {
            var minute = 60 * 1000; // 1分钟 
            var hour = 60 * minute; // 1小时 
            var day = 24 * hour; // 1天 
            var month = 31 * day; // 月 
            var year = 12 * month; // 年 
            var _date = new Date(date).getTime();
            // var diff = new Date().getTime() - new Date(date).getTime();
            var diff = new Date($tool.date(new Date(), "yyyy-MM-dd 00:00:00")).getTime() - new Date(date).getTime();
            var r = 0;
            // console.log($tool.date(new Date(date), "yyyy-MM-dd HH:mm:ss"),new Date($tool.date(new Date(), "yyyy-MM-dd 00:00:00")).getTime() > new Date(date).getTime(),diff > day || diff > month, "!!!!!!!!!!!'")
            if ((diff > day || new Date($tool.date(new Date(), "yyyy-MM-dd 00:00:00")).getTime() > new Date(date).getTime()) || diff > month) { //天 月
                r = (diff / day);
                // console.log("-------",r,Math.floor(r), 22)
                if (r <= 1) {
                    return "昨天";
                } else if (r > 1 && r < 2) {
                    return "前天";
                } else {
                    return $tool.date(_date, "MM-dd");
                }
            } else if (diff > year) { //年
                return $tool.date(_date);
            }
            return "今天";
        };
        var dataTime = "";
        var data = new Date(value);
        //data.toString()=="Invalid Date"
        if (value.toString().indexOf("-") != -1) {
            data = new Date(value.replace(/-/g, "/"));
        };
        // data.setTime(value);
        var year = data.getFullYear(); //年
        var month = addZeroF(data.getMonth() + 1); //月
        // console.log('month', month)
        var day = addZeroF(data.getDate()); //日
        var hour = addZeroF(data.getHours());
        var minute = addZeroF(data.getMinutes());
        var second = addZeroF(data.getSeconds());
        var reVlue = "";
        type = type ? type : "yyyy-MM-dd";
        if (type.indexOf("yyyy") != -1) {
            reVlue += year * 1;
        }
        if (type.indexOf("MM") != -1) {
            var zf = type.split("MM")[0].substr(-1) || "";
            reVlue += zf + month;

        }
        if (type.indexOf("dd") != -1) {
            var zf = type.split("dd")[0].substr(-1) || "";
            reVlue += zf + day;
        }
        if (type.indexOf("oday") != -1) { //当前时间属于昨天 还是 前天～～～
            reVlue += getDateInfo(data);
        }
        if (type.indexOf("HH") != -1) {
            var zf = type.split("HH")[0].substr(-1) || "";
            reVlue += zf + hour;
        }
        if (type.indexOf("mm") != -1) {
            var zf = type.split("mm")[0].substr(-1) || "";
            reVlue += zf + minute;
        }
        if (type.indexOf("ss") != -1) {
            var zf = type.split("ss")[0].substr(-1) || "";
            reVlue += zf + second;
        }
        if (type.indexOf('week') != - 1) {//返回周几 number
            var zf = type.split("week")[0].substr(-1) || "";
            reVlue += zf + data.getDay();
        }
        if (type.indexOf('WEEK') != - 1) {//返回周几 string
            var zf = type.split("WEEK")[0].substr(-1) || "";
            reVlue += zf + this.setWeek(data.getDay());
        }
        // console.log('reVlue', reVlue)
        return reVlue; //将格式化后的字符串输出到前端显示
    }
    /**
     * @description 计算总金额
     * 使用示例 $tool.countAmount(tabData.restaurant,'amount',false); 
     * @param {object} input 需要计算的数组,或者对象
     * @param {string} key 计算那个数组或者对象的键
     * @param {boolean} notRetain 是否保留两位小数 true 不保留 
     * @returns {number} count
     * @author 一枚前端
     */
    countAmount(input, key, notRetain) {
        try {
            if (typeof (input) != "object") {
                throw new Error("该过滤器必须指定数组,或者对象");
            }
            if (!key) {
                throw new Error("该过滤器必须指定过滤的键");
            };
            //对象判断
            if ($tool.isEmptyObject(input)) {
                //是数组 或者 对象进入 否则返回 0
                if (typeof (input) == "object") {
                    //是空数组 显示 0
                    if (input.length == 0) {
                        return notRetain ? 0 : "0.00";
                    } else {
                        //是对象进入判断
                        if ((input[key] && input[key] * 1) || input[key] == 0) {
                            if (!notRetain) {
                                return input[key].toFixed(2);
                                // return $filter("number")(input[key],2);
                            } else {
                                return count;
                            }
                        }
                    }
                } else {
                    return notRetain ? 0 : "0.00";
                };
            };
            var count = 0,
                state = "";
            input = input.length ? input : [];
            input.forEach(function (val, i) {
                if ((val[key] && val[key] * 1) || val[key] == 0) {
                    count += (val[key] * 1);
                }
            });
            if (!notRetain) {
                return count.toFixed(2);
                // return $filter("number")(count,2);
            } else {
                return count;
            }
        } catch (error) {
            console.error(error)
            return -1;
        }
    }
    /**
     * @description 转换保留几位
     * 使用示例 $tool.number(number,2); 
     * @param {number} value 数据源
     * @param {number} num 保留几位小数
     * @returns {string} 保留后的字符串
     * @author 一枚前端
     */
    number(value, num) {
        if (!value && value != 0) return;
        if (typeof (value * 1) == "number") {
            if (typeof (num * 1) == "number") {
                value = (value * 1).toFixed(num);
            }
            return value;
        } else {
            return value;
        }
    }
    /**
     * 是否是正数，不是正数保留两位小数
     * @param orderId {string} 订单id
     * @author 一枚前端
     */
    isSaveTwoNumber(item) {
        return (item + '').indexOf('.') != -1 ? (item * 1).toFixed(2) : item;
    }

    /**
     * @description 截取字符串-汉字两字节-字母一字节
     * @param {string} str 截取的字符串
     * @param {number} len 需要截取的长度
     * @param {string} replace 需要替换成的字符串
     * @author 一枚前端
     */
    getByteVal(val, max, replace) {
        if (!val) return;
        var returnValue = "";
        var byteValLen = 0;
        for (var i = 0; i < val.length; i++) {
            if (val[i].match(/[^\x00-\xff]/gi) != null) byteValLen += 2;
            else byteValLen += 1;
            if (byteValLen > max) break;
            returnValue += val[i];
        }
        return val != returnValue ? (returnValue + (replace ? replace : "")) : returnValue;
    };
};
window.$tool = new tool();
export default tool